문제 #

문제 설명 다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.

지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다. 지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.

제한사항 #

제한사항 board는 n * n 배열입니다. 1 ≤ n ≤ 100 지뢰는 1로 표시되어 있습니다. board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.

풀이 #

function answer(array) {
  const cols = array[0].length;
  const rows = array.length;

  const dangerous = {};

  const directions = [
    [-1, -1], // up-left
    [-1, 0], // up
    [-1, 1], // up-right
    [1, -1], // down-left
    [1, 0], // down
    [1, 1], // down-right
    [0, -1], // left
    [0, 1], // right
  ];

  let counter = 0;

  for (let row = 0; row < rows; row++) {
    for (let col = 0; col < cols; col++) {
      if (array[row][col] === 1) {
        counter++;

        for ([upDown, leftRight] of directions) {
          const newR = row + upDown;
          const newC = col + leftRight;
          if (!array[newR]) continue;

          if (
            array[newR][newC] === 0 &&
            newR >= 0 &&
            newR < rows &&
            newC >= 0 &&
            newC < cols
          ) {
            if (!dangerous[`${newR}_${newC}`]) {
              dangerous[`${newR}_${newC}`] = true;
              counter++;
            }
          }
        }
      }
    }
  }

  return rows * cols - counter;
}

후술 #

BFS, DFS의 풀이방법으로 접근하면 풀리는 문제입니다.